/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V2.0
  * @date    2024-09-12
  * @brief   使用举例-命令行交互
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "bsp.h"

#include "uart_handler.h"
#include "command_line.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
static uint8_t txBuf[128]; /* 串口管理所需发送缓冲区 */
static uint8_t rxBuf[128]; /* 串口管理所需接收缓冲区 */
static uart_handler_t usart1Hr; /* 串口管理实例 */
static cmd_line_t usartCmdLine; /* 串口命令行实例 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/**
  * @brief  串口中断函数
  *
  * @param  None
  *
  * @retval None
  */
void USART1_IRQHandler(void)
{
    static uint8_t rxData, txData, ret;
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        rxData = USART_ReceiveData(USART1);
        /* 写入接收缓存 */
        ret = uart_hr_write_rx_buf(&usart1Hr, &rxData, 1);
        if(0 == ret)
        {
            MW_WARN_LOG("uart_hr_write_rx_buf failure");
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
    
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {
        /* 读出发送缓存 */
        ret = uart_hr_read_tx_buf(&usart1Hr, &txData, 1);
        if(1 == ret)
        {
            USART_SendData(USART1, txData);
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_TXE);
    }
}

/**
  * @brief  命令行交互用户写数据接口
  *
  * @param  data : 数据缓冲区
  *
  * @param  len  : 写入的数据长度
  *
  * @retval 实际写入的长度
  */
uint32_t cmd_line_write_user(void *data, uint32_t len)
{
    return uart_hr_write_tx_buf(&usart1Hr, data, len);
}

/**
  * @brief  命令行交互用户读数据接口
  *
  * @param  buf : 数据缓存区
  *
  * @param  len : 读出的数据长度
  *
  * @retval 实际读出的长度
  */
uint32_t cmd_line_read_user(void *buf, uint32_t len)
{
    return uart_hr_read_rx_buf(&usart1Hr, buf, len);
}

/**
  * @brief  test 命令回调函数
  *
  * @param  _cmd : 命令行实例
  *
  * @param  argc : 参数数量
  *
  * @param  argv : 参数数组
  *
  * @retval None
  */
void test_cmd_callback(cmd_line_t *_cmd, int argc, char *argv[])
{
    for(uint8_t cnt = 0; cnt < argc; cnt++)
    {
        cmd_line_printf(_cmd, "param%d:%s\r\n", cnt + 1, argv[cnt]);
    }
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    uint8_t ret = 0;

    MW_VER_LOG("example-command_line", 2, 0, 0);
    
    /* BSP初始化 */
    bsp_init();

    /* 串口管理初始化 帧间隔0ms 接收超时时间0ms */
    uart_hr_init(&usart1Hr, txBuf, sizeof(txBuf), rxBuf, sizeof(rxBuf), bsp_usart1_tx_en, 0, 0);
    /* 命令行初始化 命令行对接数据读写函数需用户自行编写,函数格式参考定义 */
    ret = cmd_line_init(&usartCmdLine, cmd_line_write_user, cmd_line_read_user, CMD_LINE_ECHO_ON, CMD_LINE_RUN_START);
    if(MW_RET_OK != ret) { MW_ERROR_LOG("cmd_line_init failure"); }
    /* 命令注册 命令回调函数需用户自行编写,函数格式参考定义 */
    ret = cmd_line_register("test", test_cmd_callback);
    if(MW_RET_OK != ret) { MW_ERROR_LOG("cmd_line_register failure"); }
    
    while(1)
    {
        /* 命令行轮询处理 */
        cmd_line_poll();
    }
}

